import random
import re
from datetime import datetime
from web_.models import User
from web_.utils.response_code import RET
from . import passport_blue
from flask import abort, current_app, request, make_response, jsonify, session
from web_ import strict_redis, constants, db
from web_.utils.captcha.captcha import captcha


@passport_blue.route('/logout',methods=['POST'])
def login_out():
    '''
    退出登录：
    1.删除session中的数据.pop
    2.return
    :return:
    '''
    # 1.删除session中保持的登录数据.pop
    # 2.pop 里面有返回值
    session.pop('user_id', None)
    session.pop('nick_name', None)
    session.pop('mobile', None)
    session.pop('is_admin',None)
    # 返回 状态/或者直接切换到主页index.html
    return jsonify(errno=RET.OK, errmsg="OK")


@passport_blue.route('/login', methods=['POST'])
def login():
    '''
    登录页面
    json格式传入参数，
    1.接收参数：
    2.校验参数
    3.判断用户是否存在
    4.密码是否正确
    5.session 记录
    6.返回数据
    :return:
    '''
    # 1.接收参数：
    request_msg = request.json
    mobile = request_msg['mobile']
    password = request_msg['password']
    # 2.校验参数
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不全")
    # 3.判断用户是否存在
    try:
        user = User.query.filter(User.mobile == mobile).first()
    except Exception as f:
        current_app.logger.error(f)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="查询数据错误")
    if not user:
        return jsonify(errno=RET.USERERR, errmsg='没有这个用户')
    # 验证手机格式
    if not re.match('1[35678]\\d{9}', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机格式不正确')
    # 4.密码是否正确
    if not user.check_passowrd(password):
        return jsonify(errno=RET.PWDERR, errmsg="密码错误")
    # 5.session 记录
    session['user_id'] = user.id
    session['nick_name'] = user.nick_name
    session['mobile'] = user.mobile
    # + 添加最后时间
    user.last_login = datetime.now()
    # try:
    #     db.session.commit()
    # except Exception as f:
    #     current_app.logger.error(f)

    # 6.返回数据
    return jsonify(errno=RET.OK, errmsg="OK")


@passport_blue.route('/register', methods=['GET', 'POST'])
def registered():
    '''
    注册用户
    1.接收参数(手机，密码，手机验证码，)表格
    2.校验参数
    3.判断验证码是否正确
    4.判断手机是否正确
    5.添加到数据库
    6，返回数据
    :return:
    '''

    # 1.接收参数(手机，密码，手机验证码，)表格
    params_dict = request.json
    mobile = params_dict['mobile']
    smscode = params_dict['smscode']
    password = params_dict['password']
    # 2.校验参数
    if not all([mobile, smscode, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不全")
    # 3.判断验证码是否正确
    try:
        req_ = strict_redis.get('msg' + mobile)
    except Exception as f:
        current_app.logger.error(f)
        return jsonify(errno=RET.DBERR, errmsg="获取本地验证码失败")
    if not req_:
        return jsonify(errno=RET.NODATA, errmsg="短信验证码过期")
    if smscode != req_:
        return jsonify(errno=RET.DATAERR, errmsg="短信验证码错误")
    try:
        strict_redis.delete('msg' + mobile)

    except Exception as f:
        current_app.logger.error(f)

    # 5.添加到数据库
    user = User()
    user.nick_name = password
    user.password = password  # 加密处理
    user.mobile = mobile
    user.last_login = datetime.now()
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as f:
        current_app.logger.error(f)
        db.session.rollback()
        return jsonify(errno=RET.DATAERR, errmsg="数据保存错误")
    # 注册完成后登陆
    session["user_id"] = user.id
    session["nick_name"] = user.nick_name
    session["mobile"] = user.mobile
    session['is_admin']=user.is_admin
    # 6，返回数据
    return jsonify(errno=RET.OK, errmsg="OK")


@passport_blue.route('/smscode', methods=['POST'])
def send_msg():
    '''
    1.接收参数（随机值，验证码，电话）
    2.校验参数
    3.校验验证码
    4.生成短信验证信息
    5.借助云通讯发送短信验证
    7.保存验证码到SESSION
    6.给浏览器返回数据
    :return:
    '''
    # print('sldaj')

    # 1.接收参数（随机值，验证码，电话）
    # 电话号
    params_dict = request.json
    mobile = params_dict['mobile']
    # 验证码内容
    image_code = params_dict['image_code']
    # 随机值
    image_code_id = params_dict['image_code_id']
    # 2.校验参数
    if not all([mobile, image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不全")
    # 3.校验验证码
    try:
        # redis获取验证码
        image_verify = strict_redis.get('ImageCode_' + image_code_id)
        if image_verify:
            strict_redis.delete('ImageCode_' + image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="获取本地验证码失败")
    if not image_code:
        return jsonify(errno=RET.NODATA, errmsg="短信验证码过期")
    if image_code.lower() != image_verify.lower():
        return jsonify(errno=RET.DATAERR, errmsg="短信验证码错误")
    # 4.生成短信验证信息
    sms_code_str = "%06d" % random.randint(0, 999999)
    print(sms_code_str)

    # 5.借助云通讯发送短信验证
    # from web_.lib.yuntongxun.sms import CCP
    # reculit = CCP().send_template_sms('15719190166', [sms_code_str, constants.SMS_CODE_REDIS_EXPIRES // 60], 1)
    # if reculit != 0:
    #     return jsonify(errno=RET.THIRDERR, errmsg="发送验证码失败")
    # 7.保存验证码到redis
    try:
        strict_redis.setex('msg' + mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code_str)
    except Exception as f:
        current_app.logger.error(f)
        return jsonify(errno=RET.DBERR, errmsg="数据系统故障")
    return jsonify(errno=RET.OK, errmsg="验证码已发送")


@passport_blue.route('/image_code')
def image_code():
    '''
    1.接收参数（唯一随机值）
    2.校验参数
    3.生成验证码
    4.redis保存验证码
    5.返回图片验证码
    :return:
    '''

    # 1.接收参数（唯一随机值）get 请求
    code_id = request.args.get("code_id", None)
    # print(code_id)
    # 2.校验参数
    if not code_id:
        return abort(403)
    # 3.生成验证码
    name, text, image = captcha.generate_captcha()
    # 4.redis保存验证码
    try:
        # 参数键：【ImageCode_】+ 接收的唯一值 过期时间 IMAGE_CODE_REDIS_EXPIRES 生成验证码的值：text
        # strict_redis.('ImageCode_' + code_id, constants.IMAGE_CODE_REDIS_EXPIRES, text)
        strict_redis.setex('ImageCode_' + code_id, constants.IMAGE_CODE_REDIS_EXPIRES, text)
        pass
    except Exception as e:
        current_app.logger.error(e)
        abort(500)
        return
    # 5.返回图片验证码
    response = make_response(image)
    response.headers["Content-Type"] = "image/jpg"
    return response
